package com.peng.test.cpuCache;

import java.util.concurrent.CountDownLatch;

/**
 * Main
 *
 * 缓存行对其
 *
 * 缓存行一般默认是 64 个字节，
 * 下面的程序如果一个要修改的数据真好处于一个缓存行，
 * volatile 会 调用缓存一致性协议，以缓存行为基本单位 当这个缓存行数据变化会通知其他 cpu 修改对应的 l1 l2 中的缓存，
 * l3缓存是 多个cpu 共享的， l1 l2 是cpu 独享的（每个cpu 都有自己独占的 l1 l2）
 *
 *
 * @author: lupeng6
 * @create: 2021/2/22 10:50
 */
public class Main {

    // 注释放开， 修改的x 肯定在一个缓存行中。不会触发 缓存一致性协议
    public static class Item {
//        long l1, l2, l3, l4, l5, l6, l7;
        volatile long x;
//        long l8, l9, l10, l11, l12, l13, l14;
    }

    private static Item[] items = new Item[2];

    static {
        items[0] = new Item();
        items[1] = new Item();
    }

    private static long count = 100_000_000;

    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(2);

        Thread t1 = new Thread(() -> {
            for (long i = 0; i < count; i++) {
                items[0].x = i;
            }
            countDownLatch.countDown();
        });

        Thread t2 = new Thread(() -> {
            for (long i = 0; i < count; i++) {
                items[1].x = i;
            }
            countDownLatch.countDown();
        });

        long start = System.currentTimeMillis();

        t1.start();
        t2.start();

        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(System.currentTimeMillis() - start);
    }
}
